---
title: 安装及使用
description: Docker Engine 是客户端/服务器架构，命令行工具直接面向客户，后面的 Docker daemon 和 Registry 协作完成各项功能。
---
## 在 Ubuntu 上安装
使用 Ubuntu 的包管理工具 apt 安装
```bash
sudo apt install -y docker.io #安装Docker Engine
```
安装完毕后，启动 Docker Engine 并将当前用户加入 docker 组
```bash
sudo systemctl start docker #启动Docker Enginesudo service docker start         #启动docker服务
sudo usermod -aG docker ${USER}   #当前用户加入docker组
```
操作 Docker 必须要有 root 权限，而直接使用 root 用户不够安全，**加入 Docker 用户组是一个比较好的选择，这也是 Docker 官方推荐的做法**。

执行完上面的三条命令之后，还需要退出系统（命令 `exit`）,在重新登录一次，才能让修改用户组的命令 usermod 生效。

接下来就可以验证 Docker 是否安装成功了，使用的命令是 `docker version` 和 `docker info`。


## Docker 的使用
首先，命令 `docker ps` ,它会列出当前系统里运行的容器，就像我们在 Linux 系统里使用 `ps` 命令列出运行的进程一样。

:::tip
所有的 Docker 操作都是这种形式: 以 docker 开头，然后是子命令，比如 `docker ps`、`docker run` 等等。还可以使用 `help` 或者 `--help` 参数来查看子命令的帮助信息。
:::

```bash
[root@docker ~]# docker ps  # 因为刚刚安装了 docker 环境，这个时候还没有运行容器，所以列表展示是空的。
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
接下来是 `docker pull` 命令，从镜像仓库 (Registry) 拉取一个镜像 (image) 到本地。比如，我们拉取一个 Ubuntu 镜像到本地。
```bash
[root@docker ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:aba80b77e27148d99c034a987e7da3a287ed455390352663418c0f2ed40417fe
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest
```
这个时候，我们再次执行 `docker images` 命令，就可以看到本地已经有了一个 Ubuntu 镜像了。它会列出当前 Docker 所存储的所有镜像：
```bash
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    4e2eef94cd6b   2 weeks ago   72.9MB
```
可以看到，我们刚刚拉取的 Ubuntu 镜像，它的大小是 72.9MB。镜像的ID是 4e2eef94cd6b，这个 ID 是 Docker 生成的，每个镜像都有一个唯一的 ID。

现在，我们可以使用 `docker run` 命令来运行一个容器了。比如，我们运行一个 Ubuntu 容器，它的镜像是刚刚拉取的那个 Ubuntu 镜像，命令是 `docker run -it ubuntu`。
```bash
[root@docker ~]# docker run -it ubuntu
root@e3c8c4b7a0f4:/#
```
这个时候，我们就进入了一个 Ubuntu 容器，可以在里面执行各种命令了。比如，我们执行 `ls` 命令，就可以看到容器里的文件列表：
```bash
root@e3c8c4b7a0f4:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```
## Docker 的架构
下面这张图来自 Docker 官网，描述了 Docker Engine 的内部角色和工作流程

![Docker Architecture diagram](https://img.wkq.pub/img/docker-architecture.png)

上面敲的命令行 docker 实际上是一个 客户端 client，它会与 Docker Engine 的后台服务 Docker daemon 通信，而镜像则存储在远端的仓库 Registry 里，客户端不能直接访问镜像仓库。

Docker client 可以通过 `build `、`pull`、`run` 等命令向 Docker daemon  发送请求，而 Docker daemon 则是容器和镜像的管理者，它会响应客户端的请求，完成相应的操作。

比如从远端拉取镜像，在本地存储镜像；从镜像生成容器，管理容器等所有功能



